#ifndef LANZADORPAJARITOS_H
#define	LANZADORPAJARITOS_H

#include <vector>
#include <sstream>
#include <cmath>
#include "TuplaAleatoria.h"
#include "InfoMovimiento.h"
#include "Partida.h"
#include "Posicion.h"
#include "PajaritoRojo.h"
#include "PajaritoAzul.h"
#include "PajaritoVerde.h"
#include "Timer.h"
#include "Thread.h"

using namespace std;
using namespace TP::Juego;
using namespace TP::Temporizador;
using namespace TP::Aleatorizacion;
using namespace TP::Juego::Arena;
using namespace TP::Juego::Arena::Actores;
using namespace TP::Threading;

namespace TP { namespace Juego { namespace Motorizacion { namespace Generadores {

#define TIEMPO_LANZAMIENTO 5
#define CANT_MAX_PAJAROS 20  // Cantidad máxima de pájarops que se pueden lanzar por grupo
#define MAX_INTERVALO 10
#define CANT_CLASES_PAJAROS 3

typedef string pajaro_t;
typedef vector<pajaro_t> grupo_t;
typedef int frecuancia_t;
typedef int cant_lanzamientos_t;

/**
 * Esta clase se encarga de generar una bandada de pajaros cada una determinada
 * cantidad de tiempo.
 */

class LanzadorPajaritos : public Thread {
public:
    
    LanzadorPajaritos(Partida &partida, struct InfoMov &infoMov);
   
    /**
     * Libera los recursos asociados con la instancia.
     */
    virtual ~LanzadorPajaritos();
    
    /**
     * Genera una badada de pajaritos.
     * @param bandada Contenedor en el cual se cargan los pajaritos generados.
     */
    void generarPajaritos();
    
    /**
     * @return Retorna true si el grupo de pájaros fue lanzado; de lo contrario,
     * retorna false.
     */
    bool lanzados();
    
    /**
     * Espera hasta el timeout del timer para luego lanzar un grupo de pájaritos.
     */
    virtual void tarea();
    
private:
     /**
     * Genera un pájaro aleatoriamente.
     * @return Retorna un nuevo pájaro.
     */
    pajaro_t* __generarPajaro();
    
    /**
     * Carga una posición aleatoriamente.
     * @param posicion Posición a cargar.
     */
    Posicion* __generarPosicion() const;

    /**
     * Carga una velocidad aleatoriamente.
     * @param velocidad Velocidad a cargar.
     */
    Vector2D* __generarVelocidad() const;

    /**
     * Carga una aceleración aleatoriamente.
     * @param aceleracion Aceleracion a cargar.
     */
    Vector2D* __generarAceleracion() const;
    
    /**
     * Carga el grupo de pájaros a lanzar.
     * @param bandada Contenedor para el grupo de pájaros.
     */
    void __disparar();
    
private:
    TuplaAleatoria _posicion;
    TuplaAleatoria _velocidad;
    TuplaAleatoria _aceleracion;
    num_t _prob_pajaro_rojo;
    num_t _prob_pajaro_azul;
    num_t _prob_pajaro_verde;
    Timer _timer;
    bool _comenzado;  // Indicador de si el lanzador inició el proceso de lanzamiento o no. 
    bool _lanzados;
    Partida& _partida;
};
}}}}
#endif	/* LANZADORPAJARITOS_H */


